\subsection{Ejercicio 4}
	
\indent En el ejercicio 4 nos piden crear una funcion \code{inicializar\_dir\_usuario}. Esta finción debe inicializar un directorio de páginas y tablas de páginas para una tarea. Se pide que configure con identity mapping las direcciones 0x00000000 a 0x00100000, y que cuenten con permisos de supervisor.
	La función esta implementada en el archivo \code{mmu.c}, y lo que hace es lo siguiente:\\
\indent Primero pide dos paginas libres con la función \code{pagina\_libre\_kernel()}, una para el directorio, y otra para la tabla de páginas. Inicializa todas las entradas del directorio del usuario en 0. Luego inicializa las primeras 256 entradas de la tabla de pagina con atibutos de supervisor, y a las restantes las marca como no presentes. A continuación toma la primera entrada del directorio y le asigna la dirección de la tabla de páginas con atributos de usuario. \\
\indent Luego nos piden hacer dos funciones más: \code{mapear pagina(unsigned int virtual, unsigned int cr3, unsigned int fisica,
unsigned int atributos)} y \code{unmapear pagina(unsigned int virtual, unsigned int cr3)} \\

\indent La funcion \code{mapear\_pagina} toma una la direccion fisica que le pasaron como parámetro y se fija si la tabla de páginas esta presente. Si lo está accede y busca la página correspondiente en la entrada de páginas y le asigna la direccion (virtual srl 12) \& 0x03FF (virtual shifteada hacia la izquierda 12 veces \code{and} 0x3FF). Si no estaba presente la tabla de páginas, la crea, mapea la direccion (virtual srl 12) \& 0x03FF en el lugar que le corresponde y setea todo el resto de las entradas en 0.\\
\indent La función \code{unmapear\_pagina()} se conforma sólo con ingresar con la direccion virtual que se le pasa como parámetro al directorio de paginas, de ahí a la tabla de páginas correspondiente y busca la entrada de la tabla de páginas que apunta a la página a unmapear, y setearla en 0.\\
\indent En el item \code{c} del ejercicio se pide construir un mapa de memoria utilizando la función del item b), mapear la dirección 0x1F040000 a la memoria de video e intercambiarlo con el del kernel. Luego cambiar el color de fondo de la primer linea de la pantalla, volver al
cr3 anterior y deshacer el mapeo.\\
Este ejercicio se implemento en el archivo kernel.asm, donde se puede ver que efectivamente las funciones del item b funcionan correctamente. 




\subsection{Preguntas}
\begin{itemize}
\item Pregunta 5: La función inicializar dir usuario debe crear un directorio de páginas y sus correspondientes tablas para que las tareas que corran en modo usuario las utilicen. ¿Por que el rango de direcciones 0x00000000 a 0x00100000 llevan permisos de supervisor? ¿Éste permiso de supervisor, va en la entrada de directorio o la entrada de la tabla de páginas? ¿Qué valor debe ir en la entrada de la tabla de directorio? ¿Por qué?
\end{itemize}

Tienen privilegio de supervisor para que no puedan ser accedidas por una tarea sin antes pasar por el control del kernel, quien controla las direcciones desde la posición 0x00000000 hasta la 0x00100000. \\
Las entrada del directorio tiene asignado nivel de privilegio 3, para que las tareas puedan acceder al directorio (que abarca mas alla de la posicion 1000000) pero no puedan acceder a las paginas con privilegio 00, pero si a las que puedan tener privilegio 11. El kernel tiene control de la memoria hasta la posicion 180000, pero son paginas libres, con lo que el usuario puede llamar al kernel para pedirselas mediante \code{pagina\_libre\_kernel} para ser apuntadas por una direccion virtual en espacio del usuario. \\
Entonces, en la entrada del directorio debe ir: No-Supervisor, R/W y Presente.

\subsection{Preguntas}
\begin{itemize}
\item Pregunta 6: ¿Que ocurre si en vez de mapear, intercambiar, escribir, intercambiar y 
deshacer el mapeo, se hace el intercambio, se mapea, es escribe, se deshace y se vuelve a 
intercambiar? ¿Por qué?
\end{itemize}

Si se realiza primero el intercambio y luego el mapeo, se producirá un Page Fault. Este es ocasionado al intentar crear un mapeo sobre un directorio que en principio todavia no tiene paginas asignadas. \\
El hecho de intercambiar significa hacer apuntar el registro CR3 hacia otra dirección de memoria en la que se espera que haya un directorio. Este se encuentra inicializado (se llamo a iniciar\_dir\_usuario previamente) pero necesita a su vez estar dentro de una página, que es lo que hace el mapeo. \\
El CR3 en consecuencia apunta a una página no mapeada en memoria y se produce el Page Fault.

